package modelo.servicio;

import java.util.Date;
import java.util.List;
import modelo.bd.dao.FacturaDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Factura;

public class Facturas {

    private static Facturas instancia;
    private FacturaDAO dao;

    private Facturas() {
        this.dao = new FacturaDAO();
    }

    public static Facturas instancia() {
        if (instancia == null) {
            instancia = new Facturas();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Facturas.");
    }

    public void agregar(String claveFlujo, long folio, String idProveedor, String folioFact, Date facturacion, 
            double monto, String concepto, String comentarios, String usuario) throws DAOException {
        Factura factura = new Factura(0, folioFact.replace("'", "''"), facturacion,
                monto, concepto.replace("'", "''"), comentarios);
        factura.setProveedor(Proveedores.instancia().porClave(idProveedor));
        factura.setSolicitud(Solicitudes.instancia().porClave(claveFlujo, folio));
        if (comentarios != null) {
            factura.setComentarios(comentarios.replace("'", "''"));
        }
        dao.add(factura, usuario);
    }

    public void editar(String claveFlujo, long folio, String idProveedor, long identificador, 
            String folioFact, Date facturacion, double monto, String concepto, 
            String comentarios, String usuario) throws DAOException {
        Factura factura = new Factura(0, folioFact.replace("'", "''"), facturacion,
                monto, concepto.replace("'", "''"), comentarios);
        factura.setProveedor(Proveedores.instancia().porClave(idProveedor));
        factura.setSolicitud(Solicitudes.instancia().porClave(claveFlujo, folio));
        if (comentarios != null) {
            factura.setComentarios(comentarios.replace("'", "''"));
        }
        dao.update(factura, usuario);
    }

    public void eliminar(String clave) throws DAOException {
        dao.deleteWhere("fluj_clave = '" + clave.replace("'", "''") + "'");
    }

    public List<Factura> todos() throws DAOException {
        return this.dao.selectAll();
    }

    public Factura porClave(String claveFlujo, long identificador, String idProveedor) {
        try {
            List<Factura> ls = dao.selectWhere("FAPR_FLUJ_CLAVE  = '" + claveFlujo.replace("'", "''") + "' \n"
                        + "AND    FAPR_NUMERO      = " + identificador + " \n"
                        + "AND    FAPR_PRPO_NUMERO = '" + idProveedor+"'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Factura> obtenerR12(String proveedor) throws DAOException {
        return dao.selectProvR12(proveedor);
    }

    public Factura porFolioR12(String folio) throws DAOException {
        try {
            List<Factura> ls = dao.selectWhereR12("ai.invoice_num = '" + folio + "'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }
}
